package com.diuse;

/**
 * 设置Xss128K，来限制每个线程栈的大小
 * 实验中使用static方法，会增加递归的深度，但是不明显，静态方法不用保存类引用，非静态方法保存对象引用，应该差不多额
 * Created by carey on 2016/7/17 0017.
 */
public class StackOverFlow {


    private int stackLength = 1;
    private int threadCnt = 0;

    public void stackLeak() {
        stackLength++;
        stackLeak();
    }

    /**
     * 递归调用方法导致栈溢出
     */
    public void doFuctionSOF() {
        try {

            stackLeak();
        } catch (Throwable throwable) {
            System.out.println("sof, length is: " + stackLength);
            throwable.printStackTrace();
        }
    }


    /**
     * 创建线程是向操作系统申请空间的。操作系统可用的存储空间是固定的，如果线程栈的空间越大，那么可创建的线程数量就越小。
     * 这里出现无响应的情况，计算机崩溃了，无法看到系统打印的最大可创建的线程数。
     */
    public void doNewThreadSOF() {

        try {

            while (true) {

                new Thread(new Runnable() {
                    public void run() {
                        hold();
                    }
                }).start();
                threadCnt++;
            }
        }catch (Throwable throwable){
            System.out.println("max thread create is: " + threadCnt);
            throwable.printStackTrace();
        }

    }

    private void hold() {
        while (true) {

        }
    }

    public static void main(String[] args) throws Throwable {
        StackOverFlow sof = new StackOverFlow();
//       sof.doFuctionSOF();
        sof.doNewThreadSOF();
    }
}
